package main

import ("golang.org/x/tour/tree"
		"fmt"
	   "sort"
	   "reflect")

// Walk 步进 tree t 将所有的值从 tree 发送到 channel ch。
func Walk(t *tree.Tree, ch chan int){
	var Walkh func(t*tree.Tree, ch chan int)
	Walkh=func(t*tree.Tree, ch chan int){
	//遍历二叉树
	if t==nil{return} 
		Walkh(t.Left,ch)
		ch<-t.Value
		Walkh(t.Right,ch)
	}
	Walkh(t,ch)
	close(ch)
}

// Same 检测树 t1 和 t2 是否含有相同的值。
func Same(t1, t2 *tree.Tree) bool{

	  ch1:=make(chan int)
	  ch2:=make(chan int)
	  a:=make([]int,0)
	  b:=make([]int,0)
	  go Walk(t1,ch1)
	  go Walk(t2,ch2)
	
	  for i := range ch1 {
		  j:=<-ch2
		  a=append(a,i)
		  b=append(b,j)
	}
	//根据遍历方法顺序会有所不同
	  sort.Ints(a)
	  sort.Ints(b)
	//判断切片是否相等
	  if reflect.DeepEqual(a,b){return true}
	  return false;
}

func main() {
	ch:=make(chan int)
	go Walk(tree.New(1),ch)
	for v := range ch {
		fmt.Println("tree.value:", v)
	}
	fmt.Println(Same(tree.New(1),tree.New(1)))
	fmt.Println(Same(tree.New(1),tree.New(2)))
}
